Skip to content

fix: replace uvicorn log_config with basicConfig for consistent log format#25

Merged
Kaiohz merged 1 commit into
mainfrom
fix/simplified-logging
May 21, 2026
Merged

fix: replace uvicorn log_config with basicConfig for consistent log format#25
Kaiohz merged 1 commit into
mainfrom
fix/simplified-logging

Conversation

@Kaiohz
Copy link
Copy Markdown
Contributor

@Kaiohz Kaiohz commented May 21, 2026

Replace verbose LOG_CONFIG dict and log_config=None in uvicorn with a single logging.basicConfig() call. Matches the same pattern used in mcp-raganything.

@Kaiohz Kaiohz merged commit a24b821 into main May 21, 2026
1 check passed
@Kaiohz Kaiohz deleted the fix/simplified-logging branch May 21, 2026 16:42
Copy link
Copy Markdown
Contributor Author

@Kaiohz Kaiohz left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review — PR #25

📊 Score : 8/10


✅ Ce qui est bien fait

  1. Simplification bienvenue — Remplacer le LOG_CONFIG dict + log_config=None par un simple logging.basicConfig() est la bonne approche. Moins de code, moins d'indirection, plus lisible.

  2. Cohérence entre projets — Le pattern correspond exactement à ce qui est fait dans mcp-raganything/main.py (même format, même datefmt). C'est le bon réflexe pour homogénéiser le logging across les services SoluDevTech.

  3. Format de log amélioré — Le passage de %(asctime)s - %(name)s - %(levelname)s - %(message)s à %(asctime)s | %(levelname)-8s | %(name)s | %(message)s est un upgrade :

    • Les | sont plus lisibles que les - (séparateur visuel clair)
    • %(levelname)-8s avec alignement fixe → colonnes visuellement alignées dans les logs
    • Le datefmt explicite %Y-%m-%d %H:%M:%S élimine le format par défaut moche de Python
  4. Suppression de force=True — C'est correct. force=True est utile quand tu dois reconfigurer un logger déjà existant, mais ici au startup c'est le premier appel, pas besoin.

  5. Suppression de import sys et stream=sys.stdout — Propre. basicConfig écrit sur stderr par défaut, mais uvicorn redirige déjà correctement les logs. Pas besoin de forcer stdout.


⚠️ Points à améliorer

  1. Niveau de log hardcodé vs. settingslevel=logging.INFO est hardcodé alors que settings.log_level existe et est utilisé pour uvicorn. Dans mcp-raganything, le pattern est level=app_config.UVICORN_LOG_LEVEL.upper(). Ici, si quelqu'un met LOG_LEVEL=DEBUG dans l'env, les logs Python resteront à INFO mais uvicorn sera en DEBUG. Incohérent.

    Suggestion :

    logging.basicConfig(
        level=getattr(logging, settings.log_level.upper(), logging.INFO),
        format="%(asctime)s | %(levelname)-8s | %(name)s | %(message)s",
        datefmt="%Y-%m-%d %H:%M:%S",
    )
  2. Suppression de logging.getLogger().setLevel(logging.INFO) — OK si basicConfig suffit, mais attention : cette ligne était un filet de sécurité pour forcer le root logger à INFO même si une lib tierce l'avait changé. Si une dépendance importée avant ce fichier configure le root logger, basicConfig ne fait rien (il ne s'applique que si aucun handler n'existe encore). Le force=True d'origine gérait ce cas.

    Suggestion alternative : Garder force=True si tu veux garantir la config même en cas d'imports parasites :

    logging.basicConfig(
        level=getattr(logging, settings.log_level.upper(), logging.INFO),
        format="%(asctime)s | %(levelname)-8s | %(name)s | %(message)s",
        datefmt="%Y-%m-%d %H:%M:%S",
        force=True,
    )
  3. Pas de newline à la fin du fichier — Le diff montre \ No newline at end of file. Ajoute un saut de ligne final, c'est une convention POSIX et la plupart des éditeurs/linters le signalent.


📝 Résumé

Aspect Note
Simplicité / lisibilité ⭐⭐⭐⭐⭐
Cohérence inter-projets ⭐⭐⭐⭐⭐
Format des logs ⭐⭐⭐⭐⭐
Config dynamique (log level) ⭐⭐⭐
Robustesse (force/handlers) ⭐⭐⭐

La direction est la bonne — c'est un nettoyage de tech debt qui améliore la lisibilité et la cohérence. Les 2 points à adresser (log level dynamique + newline) sont mineurs mais valent le coup d'être fixés avant merge.

Copy link
Copy Markdown
Contributor Author

@Kaiohz Kaiohz left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review — PR #25

📊 Score : 8/10


✅ Ce qui est bien fait

  1. Simplification bienvenue — Remplacer le LOG_CONFIG dict + log_config=None par un simple logging.basicConfig() est la bonne approche. Moins de code, moins de 'indirection, plus lisible.

  2. Cohérence entre projets — Le pattern correspond exactement à ce qui est fait dans mcp-raganything/main.py (même format, même datefmt). C'est le bon réflexe pour homogénéiser le logging across les services SoluDevTech.

  3. Format de log amélioré — Le passage de %(asctime)s - %(name)s - %(levelname)s - %(message)s à %(asctime)s | %(levelname)-8s | %(name)s | %(message)s est un upgrade :

    • Les | sont plus lisibles que les - (séparateur visuel clair)
    • %(levelname)-8s avec alignement fixe → colonnes visuellement alignées dans les logs
    • Le datefmt explicite %Y-%m-%d %H:%M:%S élimine le format par défaut moche de Python
  4. Suppression de force=True — C'est correct. force=True est utile quand tu dois reconfigurer un logger déjà existant, mais ici au startup c'est le premier appel, pas besoin.

  5. Suppression de import sys et stream=sys.stdout — Propre. basicConfig écrit sur stderr par défaut, mais uvicorn redirige déjà correctement les logs. Pas besoin de forcer stdout.


⚠️ Points à améliorer

  1. Niveau de log hardcodé vs. settingslevel=logging.INFO est hardcodé alors que settings.log_level existe et est utilisé pour uvicorn. Dans mcp-raganything, le pattern est level=app_config.UVICORN_LOG_LEVEL.upper(). Ici, si quelqu'un met LOG_LEVEL=DEBUG dans l'env, les logs Python resteront à INFO mais uvicorn sera en DEBUG. Incohérent.

    Suggestion :

    logging.basicConfig(
        level=getattr(logging, settings.log_level.upper(), logging.INFO),
        format="%(asctime)s | %(levelname)-8s | %(name)s | %(message)s",
        datefmt="%Y-%m-%d %H:%M:%S",
    )
  2. Suppression de logging.getLogger().setLevel(logging.INFO) — OK si basicConfig suffit, mais attention : cette ligne était un filet de sécurité pour forcer le root logger à INFO même si une lib tierce l'avait changé. Si une dépendance importée avant ce fichier configure le root logger, basicConfig ne fait rien (il ne s'applique que si aucun handler n'existe encore). Le force=True d'origine gérait ce cas.

    Suggestion alternative : Garder force=True si tu veux garantir la config même en cas d'imports parasites :

    logging.basicConfig(
        level=getattr(logging, settings.log_level.upper(), logging.INFO),
        format="%(asctime)s | %(levelname)-8s | %(name)s | %(message)s",
        datefmt="%Y-%m-%d %H:%M:%S",
        force=True,
    )
  3. Pas de newline à la fin du fichier — Le diff montre \ No newline at end of file. Ajoute un saut de ligne final, c'est une convention POSIX et la plupart des éditeurs/linters le signalent.


📝 Résumé

Aspect Note
Simplicité / lisibilité ⭐⭐⭐⭐⭐
Cohérence inter-projets ⭐⭐⭐⭐⭐
Format des logs ⭐⭐⭐⭐⭐
Config dynamique (log level) ⭐⭐⭐
Robustesse (force/handlers) ⭐⭐⭐

La direction est la bonne — c'est un nettoyage de tech debt qui améliore la lisibilité et la cohérence. Les 2 points à adresser (log level dynamique + newline) sont mineurs mais valent le coup d'être fixés avant merge.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant